package day11;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

import org.junit.Test;

import day10.Student;

public class ExceptinDemo {

	@Test
	public void test1() {
		// java.lang.ArithmeticException: / by zero
		try {
			System.out.println(3 / 0);
		} catch (ArithmeticException e) {
			e.printStackTrace();
		}
		Student student = null;
		// NullPointerException
		System.out.println(student.getAge());
		String str = "hello";
		// StringIndexOutofBoundsException
		System.out.println(str.charAt(5));
		
		// 这些异常都是Exception下面的RuntimeException，
		// 运行时异常：程序运行时候抛出的异常
		// 出现的原因是程序的代码有错误引起，运行时异常一般不用
		// try-catch-finally结构处理，而是应该程序找到代码错误的原因解决
		// try-catch-finally一般用在编译时异常，什么是编译时异常：就是你写
		// 代码时候就会抛出的异常，不处理程序就会报错
	}
	
	@Test
	public void test2() {
		// 文件的输入流：用来读取硬盘上的文件
		// 写代码时候Eclipse会自动编译，这个时候报的异常就叫：编译时异常，
		// 如果不去处理程序就会报错
		// Unhandled exception type FileNotFoundException
		// 未雨绸缪
		// 对于编译时异常有两种处理方式：
		// 1、throw 抛出异常,我自己不想处理，让调用我的人来处理
		// 2、使用try-catch捕获这个异常
		// try-catch:不是不让代码不抛异常，而是当代码抛出异常的时候可以使用catch捕获
		// 异常后面的代码还可以继承往下执行
		try {
			FileInputStream fileInputStream = new FileInputStream("a.txt");
			fileInputStream.read();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			// finally:不管抛不抛出异常，程序都会执行
			System.out.println("-----finally----");
		}
		System.out.println("-----end-----");
	}
	
	public static void main(String[] args) {
		// 当调用的方法抛出编译时异常的时候，要求又要去处理编译时异常
		try {
			throwExceptin();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
	}

	private static void throwExceptin() throws FileNotFoundException  {
		// throws:当需要处理编译时异常时候，自己不去处理，交给调用的代码去处理
		FileInputStream fileInputStream = new FileInputStream("a.txt");
	}
	
	@Test
	public void test555() {
		AccountManager accountManager = new AccountManager(1000);
		try {
			accountManager.withdraw(1000);
		} catch (MeiQianException e) {
			e.printStackTrace();
		}
		
	}
	
	@Test
	public void test666() {
		int num = fun();
		System.out.println(num);
	}

	private int fun() {
		try {
			return 3;
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			System.out.println("-------Finally-------");
			//return 4;
		}
		
		return 0;
	}
	
	
}
